package com.agile.leetcode.drools;

import com.agile.leetcode.drools.model.Policy;
import com.alibaba.fastjson.JSON;
import org.junit.Before;
import org.junit.Test;
import org.kie.api.KieServices;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;

/**
 * @Author:ChenZhangKun
 * @Date: 2021/8/12 10:07
 */
public class Client {
    private KieContainer kieContainer;
    private Policy policy;

    /**
     * 在初始化方法中，构建KieServices.Factory.get();，这个过程是比较耗费资源，实际业务使用中也不会频繁的构建。
     * 从KieServices中获取KieContainer，用于给定KieModule的所有kiebase的容器。
     * 设置FACT对象，其实就是你的决策对象的一些条件值。
     */
    @Before
    public void init() {
        // 构建kieService
        KieServices kieServices = KieServices.Factory.get();
        kieContainer = kieServices.getKieClasspathContainer();
        policy = new Policy();
        policy.setSex("男");
        policy.setAge(1000);
        policy.setUserSingle(false);
        policy.setUserMarry(false);
        policy.setUserParenting(true);
        System.out.println("决策请求：" + JSON.toJSONString(policy));
    }

    /**
     * 获取kmodule.xml中配置中名称为all-rules的session，默认为有状态的。
     * 设置决策对象kieSession.insert(policy);
     * 设置全局对象kieSession.setGlobal("res", result);，用于最终把结果输出
     * 开始执行规则kieSession.fireAllRules()
     * 最终输出结果，到最后释放资源kieSession.dispose()
     */
    @Test
    public void test() {
        KieSession kieSession = kieContainer.newKieSession("all-rules");
        kieSession.insert(policy);
        // 拿到结果
        Result result = new Result();
        kieSession.setGlobal("res", result);
        int count = kieSession.fireAllRules();
        System.out.println("Fire rule(s)：" + count);
        System.out.println("决策结果(Drools)：" + result);

        kieSession.dispose();
    }
}
